package com.star.common.kit.md5;

import org.springframework.util.DigestUtils;
import org.springframework.util.StringUtils;

import java.nio.charset.StandardCharsets;
import java.util.UUID;

/**
 * 密码加密
 * @author zhouhengzhe
 */
public class Md5Utils {

    /**
     * 加盐加密
     *
     * @param password
     * @return 加密后的密码
     */
    public static PasswordInfo encrypt(String password) {
        //生成盐值,使用随机字符串UUID，UUID为32位的
        String salt = UUID.randomUUID().toString().replace("-", "");
        //（盐值+密码）进行MD5加密,DigestUtils.md5DigestAsHex参数为字节数组,生成一个十六进制32位的字符串
        String finalPassword = DigestUtils.md5DigestAsHex((salt + password).getBytes(StandardCharsets.UTF_8));
        //将盐值和加密的密码组合返回,最终存储到数据库中的密码
        return new PasswordInfo(finalPassword, salt);
    }

    /**
     * 校验密码
     *
     * @param password   前段传过来的密码
     * @param dbPassword 数据库密码
     * @param salt       盐值
     * @return
     */
    public static boolean decrypt(String password, String dbPassword, String salt) {
        if (StringUtils.hasLength(password) && StringUtils.hasLength(dbPassword) && StringUtils.hasLength(salt)) {
            //根据获取的盐值生成校验的密码
            String checkPassword = DigestUtils.md5DigestAsHex((salt + password).getBytes(StandardCharsets.UTF_8));
            //用校验密码与数据库保存的密码进行校验
            return checkPassword.equals(dbPassword);
        }
        return false;
    }


    /**
     * 密码相关信息
     * @param password
     * @param salt
     */
    public record PasswordInfo(String password,String salt){

    }
}
